/* 
 * File:   Cliente.h
 * Author: max
 *
 * Created on October 20, 2012, 9:05 AM
 */

#ifndef CLIENTE_H
#define	CLIENTE_H

#include <string>
#include <cstdlib>
#include <iostream>
#include <ostream>
#include <vector>
#include "client_SocketAsincronico.h"
#include "client_IEnviante.h"
#include "client_IMensajero.h"
#include "client_IObservadorSocketManejadorEvento.h"
#include "client_IRepositorioPollerManejadorEvento.h"
#include "client_ObservadorSocket.h"
#include "client_IRespuestaServidorManejador.h"
#include "client_FileServiceProxy.h"
#include "client_EcoServiceProxy.h"
#include "client_RepositorioPoller.h"
#include "client_Operacion.h"
#include "common_Excepcion.h"
#include "common_Repositorio.h"
#include "common_ClientConfFileManager.h"

#define OK "OK"

using namespace std;
using namespace TP;
using namespace TP::Servicios;
using namespace TP::Operaciones;
using namespace TP::Comunicacion;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Comunicacion { 

    class Cliente : public IRepositorioPollerManejadorEvento 
                  , public IObservadorSocketManejadorEvento
    {
    
    public:
    
        Cliente(ClientConfFileManager* pConfigurationManager, std::ostream& pLog);

        virtual ~Cliente();

        void Iniciar() throw (Excepcion&);
        
        void Finalizar() throw (Excepcion&);
        
        bool conectado();
        
        bool Autenticar();
        
        string GetCredencial ();
        
        /* notificacionErrorConexion:
         *      Maneja los mensajes de error de conexion por parte del socket.
         */
        void notificarErrorConexion (IEnviante* pEnviante, const string& pMensaje);
        
        /* notificarMensajeEntrante:
         *      Maneja la notificacion de un mensaje entrante a traves del socket.
         */
        void notificarMensajeEntranteServidor (IEnviante* pEnviante, const string& pMensaje);
        
        /* archivoNuevoEvento:
         *      Maneje la notificacion de nuevo evento por parte del RepositorioPoller
         */
        void archivoNuevoEvento(const string & pNombreArchivo);
        
        /* archivoModificadoEvento.
         *      Maneja la notificacion de archivo modificado por parte del poller.
         */
        void archivoModificadoEvento(const string & pNombreArchivo);
        
    private:
        
        void ObtenerRepositorioServidor () throw (Excepcion &) ;
        
        vector<string> hidratarMensaje(const string& pMensaje) throw (Excepcion &);

        std::ostream& _log;
        SocketAsincronico* _socket;
        ObservadorSocket* _observadorSocket;
        vector<IRespuestaServidorManejador*> _respuestaServidorManejadores;
        RepositorioPoller* _repositorioPoller;
        Repositorio* _repositorio;
        ClientConfFileManager* _config;
        FileServiceProxy* _fileService;
        EcoServiceProxy* _ecoService;
    };
}}

#endif	/* CLIENTE_H */

